home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok72.lha
/
while-Interpreter
/
Interpreter.dok
< prev
next >
Wrap
Text File
|
1993-08-15
|
6KB
|
170 lines
while Interpreter von:
^^^^^^^^^^^^^^^^^^^^^^
Dieter Seidel
Einsteinstr. 19
7410 Reutlingen
West Germany Datum: 24.07.1992
Copyright:
^^^^^^^^^^
Das hier veröffentlichten Programme und die dazugehörigen Modula-2 Source
Codes sind PD-Freeware, unterliegen damit dem Copyright von Dieter
Seidel. Sie dürfen also jederzeit kopiert werden und weitergegeben werden.
Die Benutzung und Weitergabe bezieht sich aber nur für nicht-kommerzielle
(also Schüler/Studenten, Hobby usw.), wird für das Kopieren mehr als
5,--DM verlangt ist das kommerziell, Zwecke.
Desweiteren untersage ich jedwede Veröffentlichung
der !veränderten! Modula-2 Source Codes bzw. Programme.
Sollen diese Programme in andere Serien ausser AMOK und Fred Fish
aufgenommen werden, wird meine schriftliche Einverständniserklärung
benötigt.
Hardware-Voraussetzungen:
^^^^^^^^^^^^^^^^^^^^^^^^^
Der Interpreter läuft auf allen Amiga's. Der Start sollte jedoch vom CLI
erfolgen. Ich habe jedoch ein Script eingerichtet, so das das Programm
auch von der Workbench aufgerufen werden kann. Hierzu wird jedoch IconX
im C: Ordner verlangt.
Entwicklung:
^^^^^^^^^^^^
Dieses Programm entstand nach einer Übungs-aufgabe im WS 91/92 der
Universität Karlsruhe im Fach Informatik III.
Nachdem ich 99.9% des Programmes in diesem Semester fertiggestellt habe,
benötigte ich ersteinmal ein halbes Jahr um mich damit wieder zu
beschäftigen. Ich habe gestern nur einen Fehler in den Unterprogramm
Routinen U3 und U4 entfernt und das ganze nocheinmal getestet.
Eigentlich wollte ich noch einiges mehr einbauen, was mir jetzt
allerdings zu viel ist. Damit ist die Arbeit an diesem Programm
für mich beendet.
Der Interpreter:
^^^^^^^^^^^^^^^^
Die Syntax von while-Programmen lehnt sich sehr stark an die Syntax von
Pascal-Programmen an. Damit dürfte es kein Problem sein eigene Programme
dafür zu entwickeln.
Für Nicht-Informatiker: Ein while-Programm entspricht in etwa einer
Turing Maschine. Nicht mehr und nicht weniger.
Damit ist es ziemlich sinnlos größere Programme
damit schreiben zu wollen.
Es stehen nur while Schleifen und Zuweisungen zur
Verfügung.
Es existieren folgende Befehle (in Klammern die Abkürzungen für die
Programmeingabe) :
begin [b]
end [e]
while x1 # x2 do [wx1#x2d] ; Schleife
:= [:] ; Zuweisung
succ [s] ; Nachfolger x:=x+1
pred [p] ; Vorgänger x:=x-1
Xn [Xn] ; Variable X mit einer beliebigen Zahl n
; Z.B.: X0, X1, X123 ...
Achtung: Es stehen nur die Variablen X0, X1, ... X99 zur Verfügung.
Diese sind, entsprechend der Definition von while Programmen,
als CARDINAL definiert.
Nach der Eingabe des Programmes mit Hilfe der in den eckigen Klammern
stehenden Abkürzungen, wird die Quadrupeldarstellung des Programmes
berechnet und das Programm nochmals ausgegeben.
Dabei besteht ein Quadrupel aus:
1. Die Zeilennummer. Jeder Befehl hat seine eigene, beginnend bei 1 und
fortlaufend numeriert. Die Anweisungen `begin' und `end' bekommen
keine Zeilennummern.
2. Die Anweisung in Kurzform.
3. Die Zeilennummer die als nächstes auszuführen ist. Bei einer
while Schleife ist es die nächste Zeile.
Bei einer Zuweisung ist es entweder die Abfrage einer while Schleife
oder die nächste Zeile.
4. Die Zeilennummer die als nächstes auszuführen ist, falls ein
while Konstrukt zu einem FALSE geführt hat. Siehe auch Punkt 3.
Falls bis jetzt kein Fehler aufgetreten ist, wird der Interpreter
aufgerufen.
Die Fragen die hier gestellt werden, sollten selbsterklärend sein, bis
auf die letzte.
Ich habe die while Syntax so erweitert, daß es möglich ist vordefinierte
Unterprogramme aufzurufen. Diese sind Addition, Subtraktion,
Multiplikation, Division und Rest der Division.
Dabei wird einfach U1, U2, ... U5 für das entsprechende Unterprogramm
eingegeben. Die Variablen X0, X1, ... X9 werden für die Funktionswerte
benötigt.
Beispiel:
^^^^^^^^^
Schreiben Sie ein while Programm, das X1:=MAXIMUM(X2,X3,X4) berechnet.
X2, X3 und X4 sind die Eingabevariablen, X1 die Ausgabevariable.
Testen Sie dieses Programm für X2:=2, X3:=4 und X4:=3.
Und dies ist die Lösung die man so eingeben sollte. Die Besitzer von OS 2.0
können das folgende Programm einfach mit der Maus ausschneiden.
Allen anderen wünsche ich viel Spaß beim abtippen.
bx1:0;x2:2;x3:4;x4:3;x5:0;
wx2#x5dbx1:s(x1);x2:p(x2);x3:p(x3);x4:p(x4)e;
wx3#x5dbx1:s(x1);x3:p(x3);x4:p(x4)e;
wx4#x5dbx1:s(x1);x4:p(x4)e
e
Der Interpreter erzeugt dann:
( 1;X1:0 ; 2; 2) X1:=0;
( 2;X2:2 ; 3; 3) X2:=2;
( 3;X3:4 ; 4; 4) X3:=4;
( 4;X4:3 ; 5; 5) X4:=3;
( 5;X5:0 ; 6; 6) X5:=0;
( 6;X2#X5 ; 7;11) while X2 # X5 do
begin
( 7;X1:s(X1) ; 8; 8) X1:=succ(X1);
( 8;X2:p(X2) ; 9; 9) X2:=pred(X2);
( 9;X3:p(X3) ;10;10) X3:=pred(X3);
(10;X4:p(X4) ; 6; 6) X4:=pred(X4)
end;
(11;X3#X5 ;12;15) while X3 # X5 do
begin
(12;X1:s(X1) ;13;13) X1:=succ(X1);
(13;X3:p(X3) ;14;14) X3:=pred(X3);
(14;X4:p(X4) ;11;11) X4:=pred(X4)
end;
(15;X4#X5 ;16;18) while X4 # X5 do
begin
(16;X1:s(X1) ;17;17) X1:=succ(X1);
(17;X4:p(X4) ;15;15) X4:=pred(X4)
end
end
Beispiel:
^^^^^^^^^
Schreiben Sie ein Programm, das die Summe von X1 = 7 und X2 = 3 berechnet.
Lösung:
bX1:7X2:3U1e
Hier benutze ich ein Unterprogramm, welches normalerweise nicht erlaubt
ist.